package com.colloquial.arithcode2;

import java.util.ArrayList;

public class BitArrayStream {

	private static final boolean T = true;
	private static final boolean F = false;

	private ArrayList<Boolean> aDatos;

	
	public BitArrayStream() {
		aDatos=new ArrayList<Boolean>();		
	}
	
	public BitArrayStream(byte[] xDatosACargar) {
		
		aDatos=new ArrayList<Boolean>();
		boolean[] BitsDatos=null;
		byte NumeroBitsRelleno=xDatosACargar[0];

		for (int i=1; i<xDatosACargar.length; i++) {
			BitsDatos=new boolean[8];
			BitsDatos=ConversionesTiposDatos.ConvertirByteABits(xDatosACargar[i]);
			
			int CantidadBitsDatos=BitsDatos.length;
			if ((NumeroBitsRelleno>0) && (i==xDatosACargar.length-1))
				CantidadBitsDatos=BitsDatos.length-NumeroBitsRelleno;
			
			for (int j=0; j<CantidadBitsDatos; j++) {
				if (BitsDatos[j]==T)
					aDatos.add(T);
				else
					aDatos.add(F);
			}
		}
	}
	
	public void PutBit(boolean xBit) {
		aDatos.add(xBit);
	}

	public boolean BitAt(int xPosicion) {		
		return aDatos.get(xPosicion);
	}
	
	public int Lenght() {
		return aDatos.size();		
	}

	public byte[] GetBytes(){
	
		byte NumeroBitsRelleno=0;
		int NumeroBytesSalida=(int)Math.floor(aDatos.size()/8);
		int j=0;
		
		if (aDatos.size()%8==0)
			NumeroBytesSalida+=1;
		else
			NumeroBytesSalida+=2;
		
		byte[] Salida = new byte[NumeroBytesSalida];
		boolean[] BitsDatos = null;
		
		for (int i=1; i<NumeroBytesSalida; i++) {
			
			BitsDatos = new boolean[8];
			for (int k=0; k<8; k++) {
				if (j>(aDatos.size()-1)) {
					BitsDatos[k]=F;
					NumeroBitsRelleno++;
				}
				else
					BitsDatos[k]=aDatos.get(j);
				j++;
			}
			Salida[i]=ConversionesTiposDatos.ConvertirBitsAByte(BitsDatos);
		}		
		Salida[0]=NumeroBitsRelleno;
		
		return Salida;
	}	
	
	public String ToBinaryString() {
		
		String TempSalida=new String();
		
		for (int i=0; i<aDatos.size(); i++) {
			if (aDatos.get(i)==T)
				TempSalida=TempSalida.concat("1");
			else
				TempSalida=TempSalida.concat("0");
		}
	
		return TempSalida;
	}
	
	public void PrintDatos() {
		System.out.println("");
		System.out.print("[");
		for (int i=0; i<aDatos.size(); i++) {
			if (aDatos.get(i)==T)
				System.out.print("1");
			else
				System.out.print("0");
		}
		System.out.print("]");
		System.out.println("");		
	}
}
